home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 March / macformat-022.iso / Shareware City / Developers / src / bbedit-30-dev-kit.hqx / BBEdit 3.0 Extension Dev. Kit / Examples / prefix.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-18  |  4.6 KB  |  219 lines

  1. #include <SetupA4.h>
  2.  
  3. #include "ExternalInterface.h"
  4. #include "DialogUtilities.h"
  5.  
  6. /*
  7.     This external shows the use of some less trivial functionality.
  8.  
  9.     It puts up a dialog, and uses the text entered in the text field
  10.     to prefix every line, optionally in the selection.
  11. */
  12.  
  13. enum
  14. {
  15.     sel_only = 3,
  16.     
  17.     insert,
  18.     delete,
  19.     
  20.     beginning,
  21.     end,
  22.     
  23.     prefix_str
  24. };
  25.  
  26. static struct
  27. {
  28.     Boolean    insert;
  29.     Boolean    line_start;
  30.     Boolean    sel_only;
  31.     Boolean    pad;
  32.     
  33.     Str255    prefix_str;
  34. } prefix_info;
  35.  
  36. static void maintain_buttons(DialogPtr d)
  37. {
  38.     SetDlgCtl(d, insert, prefix_info.insert);
  39.     SetDlgCtl(d, delete, ! prefix_info.insert);
  40.     
  41.     SetDlgCtl(d, beginning, prefix_info.line_start);
  42.     SetDlgCtl(d, end, ! prefix_info.line_start);
  43.  
  44.     SetDlgCtl(d, sel_only, prefix_info.sel_only);
  45. }
  46.  
  47. pascal void main(ExternalCallbackBlock *callbacks, WindowPtr w)
  48. {
  49.     DialogPtr d;
  50.     GrafPtr save_port;
  51.     
  52.     short act_len;
  53.     
  54.     long sel_end, sel_start, first_char;
  55.     long start_line, end_line;
  56.     long old_start;
  57.     
  58.     short item;
  59.     
  60.     Handle text;
  61.     char *s;
  62.     
  63.     RememberA0();
  64.     SetUpA4();
  65.     
  66.     GetPort(&save_port);
  67.     
  68.     d = callbacks->CenterDialog(128);
  69.     SetPort(d);
  70.         
  71.     callbacks->GetSelection(&sel_start, &sel_end, &first_char);
  72.     
  73.     callbacks->GetPreference('Prfx', sizeof(prefix_info), &prefix_info, &act_len);
  74.     if (act_len <= 0)
  75.     {
  76.         prefix_info.insert = TRUE;
  77.         prefix_info.line_start = TRUE;
  78.         BlockMove("\p> ", prefix_info.prefix_str, 3);
  79.     }
  80.     
  81.     prefix_info.sel_only = (sel_end != sel_start);
  82.     SetDlgCtl(d, sel_only, prefix_info.sel_only);
  83.     XAbleDlgCtl(d, sel_only, prefix_info.sel_only);
  84.         
  85.     SetStrItem(d, prefix_str, prefix_info.prefix_str);
  86.     
  87.     SelIText(d, prefix_str, 0, 255);
  88.     
  89.     do {
  90.         maintain_buttons(d);
  91.         
  92.         ModalDialog(callbacks->StandardFilter, &item);
  93.         
  94.         switch (item)
  95.         {
  96.             case insert:
  97.             case delete:
  98.                 prefix_info.insert = (item == insert);
  99.                 break;
  100.                 
  101.             case beginning:
  102.             case end:
  103.                 prefix_info.line_start = (item == beginning);
  104.                 break;
  105.                 
  106.             case sel_only:
  107.                 prefix_info.sel_only = ! prefix_info.sel_only;
  108.                 break;
  109.         }
  110.     } while ((item != 1) && (item != 2));
  111.     
  112.     ReadStrItem(d, prefix_str, prefix_info.prefix_str);
  113.         
  114.     DisposDialog(d);
  115.     SetPort(save_port);
  116.     
  117.     if (item == 1)
  118.     {
  119.         callbacks->SetPreference('Prfx', sizeof(prefix_info), &prefix_info, &act_len);
  120.  
  121.         start_line = 0;
  122.         end_line = callbacks->GetLastLine();
  123.         
  124.         if (prefix_info.sel_only)
  125.         {
  126.             start_line = callbacks->GetLineNumber(sel_start);
  127.             end_line = callbacks->GetLineNumber(sel_end);
  128.         } else
  129.             callbacks->SetSelection(0, 0x7FFFFFFF, first_char);
  130.         
  131.         if (callbacks->PresetUndo())
  132.         {
  133.             s = (char *)&prefix_info.prefix_str[0];
  134.             
  135.             if (s[0] != 0)
  136.             {
  137.                 text = callbacks->GetWindowContents(w);
  138.                 
  139.                 callbacks->StartProgress("\pChanging Lines…", end_line - start_line, TRUE);
  140.                 old_start = start_line;
  141.                 
  142.                 if (prefix_info.line_start)    
  143.                 {
  144.                     if (prefix_info.insert)
  145.                     {
  146.                         for ( ; start_line < end_line; start_line++)
  147.                         {
  148.                             if (callbacks->DoProgress(start_line - old_start))
  149.                                 break;
  150.                             
  151.                             sel_start = callbacks->GetLinePos(start_line);
  152.                             callbacks->SetSelection(sel_start, sel_start, first_char);
  153.                             callbacks->Insert((char *)&s[1], s[0]); 
  154.                         }
  155.                     }
  156.                     else
  157.                     {
  158.                         for ( ; start_line < end_line; start_line++)
  159.                         {
  160.                             if (callbacks->DoProgress(start_line - old_start))
  161.                                 break;
  162.                             
  163.                             sel_start = callbacks->GetLinePos(start_line);
  164.                             
  165.                             if (callbacks->FindPattern(*text, sel_start + s[0] + 1, sel_start,
  166.                                                         &s[1], s[0], FALSE) >= 0)
  167.                             {
  168.                                 callbacks->SetSelection(sel_start, sel_start + s[0], first_char);
  169.                                 callbacks->Delete();
  170.                             }
  171.                         }
  172.                     }
  173.                 }
  174.                 else
  175.                 {
  176.                     if (prefix_info.insert)
  177.                     {
  178.                         for ( ; start_line < end_line; start_line++)
  179.                         {
  180.                             if (callbacks->DoProgress(start_line - old_start))
  181.                                 break;
  182.                             
  183.                             sel_start = callbacks->GetLinePos(start_line);
  184.                             sel_start = callbacks->GetLineEnd(sel_start);
  185.                             
  186.                             callbacks->SetSelection(sel_start, sel_start, first_char);
  187.                             callbacks->Insert((char *)&s[1], s[0]); 
  188.                         }
  189.                     }
  190.                     else
  191.                     {
  192.                         for ( ; start_line < end_line; start_line++)
  193.                         {
  194.                             if (callbacks->DoProgress(start_line - old_start))
  195.                                 break;
  196.                             
  197.                             sel_start = callbacks->GetLinePos(start_line);
  198.                             sel_end = callbacks->GetLineEnd(sel_start);
  199.                             
  200.                             if (callbacks->FindPattern(*text, sel_end, sel_end - s[0],
  201.                                                         &s[1], s[0], FALSE))
  202.                             {
  203.                                 callbacks->SetSelection(sel_end - s[0], sel_end, first_char);
  204.                                 callbacks->Delete();
  205.                             }
  206.                         }
  207.                     }
  208.                 }
  209.                 
  210.                 callbacks->DoneProgress();
  211.             }
  212.             
  213.             callbacks->SetUndo();
  214.         }
  215.     }
  216.     
  217.     RestoreA4();
  218. }
  219.